/** 将mustache的字符串装换为指定格式 tokens，折叠版 */
export default function nestTokens(tokens) {
    let nestedTokens = []
    // 收集器
    let collector = nestedTokens; // 浅拷贝
    // 栈结构，存放小tokens，栈顶（靠近端口的，最新进入）的tokens数组中当前操作的这个tokens小数组
    let sections = []
    tokens.forEach(token => {
        switch (token[0]) {
            case '#':
                // 收集器中放入这个token
                collector.push(token);
                // 入栈
                sections.push(token);
                // 收集器要换人了，给token添加下标为2的项，并且让收集器指向他
                collector = token[2] = []
                break;
            case '/':
                // 出栈.pop()会返回刚刚弹出的项
                let section_pop = sections.pop();
                // 改变收集器为栈结构队尾（队尾是栈顶）哪项的下标为2的数组
                collector = sections.length ? sections[sections.length - 1][2] : nestedTokens;
                break;
            default:
                // collector收集器始终是一个浅拷贝（最外层，层层嵌套的最末尾），在适当位置（sections有值就是sections最后一个数组的下标2号数组），被推入指定数据
                collector.push(token)

        }
    });
    return nestedTokens;
}